MyBatis关联查询的实现:一对多

您所在的位置:网站首页 mybatis xml 一对多 MyBatis关联查询的实现:一对多

MyBatis关联查询的实现:一对多

2022-05-30 05:32| 来源: 网络整理| 查看: 265

有2个实体:用户、订单,一个用户可以拥有多个订单,同时这多个订单属于一个用户,即一对多。

 

user_tb:

 

 

order_tb:

在“多”的一方(order)添加“一”的一方(user)的主键(user_id)作为外键。

 

 

 

 

使用嵌套结果实现一对多 (1)给2个实体都编写pojo类,需要在“一”的一方写个List来关联“多”的一方 package com.chy.pojo; public class Order { private Integer no; private Integer goods_id; private Integer goods_amount; public Integer getNo() { return no; } public void setNo(Integer no) { this.no = no; } public Integer getGoods_id() { return goods_id; } public void setGoods_id(Integer goods_id) { this.goods_id = goods_id; } public Integer getGoods_amount() { return goods_amount; } public void setGoods_amount(Integer goods_amount) { this.goods_amount = goods_amount; } @Override public String toString() { return "Order{" + "no=" + no + ", goods_id=" + goods_id + ", goods_amount=" + goods_amount + '}'; } }

 

 

package com.chy.pojo; import java.util.List; public class User { private Integer id; private String username; private String password; private String tel; private String address; private List orderList; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List getOrderList() { return orderList; } public void setOrderList(List orderList) { this.orderList = orderList; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + ", tel='" + tel + '\'' + ", address='" + address + '\'' + ", orderList=" + orderList + '}'; } }

toString()只是为了方便测试、调试,后期可以去掉。

 

 

(2)给“一”的一方写Mapper接口、xml映射文件 package com.chy.mapper; import com.chy.pojo.User; public interface UserMapper { public User queryUserById(Integer id); }

 

DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> SELECT user_tb.*,order_tb.* FROM user_tb,order_tb WHERE user_tb.id=#{id} AND order_tb.user_id=user_tb.id

因为关联的是集合(List),所以用,property指定表示多的一方(list)的属性名,ofType指定多的一方的数据类型(pojo类)。

里用、配置多的一方的映射。

 

所谓关联查询,是查询结果中同时包含双方(2张表)的多个字段,

如果只查询一张表的字段,比如说只查询某个用户的订单,不查询此用户本身的信息,直接根据外键user_id查order_tb表,不需要查user_tb,不必使用关联查询,写个OrderMapper接口、OrderMapper.xml就ok。

 

 

(3)使用 package com.chy.utils; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream; public class MyBatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession(){ return sqlSessionFactory.openSession(); } }

 

package com.chy.test; import com.chy.mapper.UserMapper; import com.chy.pojo.User; import com.chy.utils.MyBatisUtils; import org.apache.ibatis.session.*; public class Test { public static void main(String[] args) { SqlSession sqlSession = MyBatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryUserById(1); System.out.println(user); sqlSession.close(); } }

 

也可以使用嵌套查询来实现一对多(不推荐)。

原文链接:https://www.cnblogs.com/chy18883701161/p/12166505.html



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3